
package com.hlkj.pay.app.merchant.ext.impl.huifu.handler.params;
/*
 * Hlpay-Plus aggregate payment system.
 * Copyright (c) 2024-2025 Hlpay Team Copyright has the right of final interpretation.
 */

import com.alibaba.fastjson.JSONObject;
import com.hlkj.framework.common.pojo.CommonResult;
import com.hlkj.framework.common.util.json.JsonUtils;
import com.hlkj.pay.app.merchant.ext.impl.huifu.dto.HuiFuConfig;
import com.hlkj.pay.app.merchant.ext.impl.huifu.utils.HuiFuUtil;
import com.hlkj.pay.common.PayResultCode;
import com.hlkj.pay.enums.PayEnums;
import com.hlkj.pay.infrastructure.model.merchant.MerchantAccessCardDO;
import com.hlkj.pay.infrastructure.model.pay.ProviderChannelConfigDO;
import com.huifu.bspay.sdk.opps.core.BasePay;
import com.huifu.bspay.sdk.opps.core.config.MerConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.util.Map;

/**
 * 汇付 商户进件参数处理
 * 
 * @author HlpayTeam
 * @date 2024/09/26 12:02
 */
@Slf4j
public class HuiFuMerchantAccessCommonParamsHandle {

    public CommonResult<HuiFuConfig> huiFuConfig(ProviderChannelConfigDO providerChannelConfigDO, boolean test) {
        String channelConfig = providerChannelConfigDO.getParamsConfig();
        if (StringUtils.isEmpty(channelConfig)) {
            return CommonResult.error(PayResultCode.PAY_CHANNEL_CONFIG_NOT_EXITS);
        }
        // 配置转换
        HuiFuConfig huiFuConfig;
        try {
            // 配置转换
            huiFuConfig = JsonUtils.parseObject(channelConfig, HuiFuConfig.class);
        }
        catch (Exception e) {
            String format = String.format(PayResultCode.PAY_CHANNEL_CONFIG_ERROR.getMsg(), "汇付");
            return CommonResult.error(PayResultCode.PAY_CHANNEL_CONFIG_NOT_EXITS.getCode(), format);
        }
        boolean params = true;
        if (!StringUtils.hasText(huiFuConfig.getSysId())) {
            params = false;
        }
        if (!StringUtils.hasText(huiFuConfig.getProductId())) {
            params = false;
        }
        if (!StringUtils.hasText(huiFuConfig.getRsaPublicKey())) {
            params = false;
        }
        if (!StringUtils.hasText(huiFuConfig.getRsaPrivateKey())) {
            params = false;
        }
        if (!params) {
            String format = String.format(PayResultCode.PAY_CHANNEL_CONFIG_ERROR.getMsg(), "汇付");
            return CommonResult.error(PayResultCode.PAY_CHANNEL_CONFIG_NOT_EXITS.getCode(), format);
        }
        return CommonResult.success(huiFuConfig);
    }

    public static String companyType(String code) {
        // 企业类型：
        // 1：政府机构
        // 2：国营企业
        // 3：私营企业
        // 4：外资企业
        // 5：个体工商户
        // 6：其它组织
        // 7：事业单位
        // 8：业主委员会；
        switch (code) {

            case "1":
            case "2":
            case "3":
            case "4":
            case "5":
            case "6":
            case "7":
                return code;
            case "8":
                return "9";
            default:
                return null;
        }
    }

    public static String licenseType(String code) {
        // 营业执照类型：
        // 1：营业执照
        // 2：营业执照(多证合一)
        // 3：事业单位法人证书
        // 4：社会团体法人登记证书
        // 5：民办非企业单位登记证书
        // 6：基金会法人登记证书
        // 7：宗教活动场所登记证
        // 8：其他证书/批文/证明
        // 9：执业许可证/执业证
        // 10：基层群众性自治组织特别法人统一社会信用代码证
        // 11：农村集体经济组织登记证
        // 12：业主委员会备案证明

        // NATIONAL_LEGAL：营业执照
        // NATIONAL_LEGAL_MERGE：营业执照(多证合一)
        // INST_RGST_CTF：事业单位法人证书
        // CERTIFICATE_TYPE_0001：社会团体法人登记证书
        // CERTIFICATE_TYPE_0002：民办非企业单位登记证书
        // CERTIFICATE_TYPE_0003：基金会法人登记证书
        // CERTIFICATE_TYPE_0004：宗教活动场所登记证
        // CERTIFICATE_TYPE_0005：其他证书/批文/证明
        // CERTIFICATE_TYPE_0006：执业许可证/执业证
        // CERTIFICATE_TYPE_0007：基层群众性自治组织特别法人统一社会信用代码证
        // CERTIFICATE_TYPE_0008：农村集体经济组织登记证
        // OWNERS_COMMITTEE：业主委员会备案证明
        switch (code) {
            case "1":
                return "NATIONAL_LEGAL";
            case "2":
                return "NATIONAL_LEGAL_MERGE";
            case "3":
                return "INST_RGST_CTF";
            case "4":
                return "CERTIFICATE_TYPE_0001";
            case "5":
                return "CERTIFICATE_TYPE_0002";
            case "6":
                return "CERTIFICATE_TYPE_0003";
            case "7":
                return "CERTIFICATE_TYPE_0004";
            case "8":
                return "CERTIFICATE_TYPE_0005";
            case "9":
                return "CERTIFICATE_TYPE_0006";
            case "10":
                return "CERTIFICATE_TYPE_0007";
            case "11":
                return "CERTIFICATE_TYPE_0008";
            case "12":
                return "OWNERS_COMMITTEE";
            default:
                return null;
        }
    }

    public static String certType(String code) {
        // 营业执照类型：
        // 1:身份证
        // 2:护照
        // 3:军官证
        // 4:士兵证
        // 5:回乡证
        // 6:户口本
        // 7:外国护照
        // 8:其他
        // 9:暂住证
        // 10:警官证
        // 11:文职干部证
        // 12:港澳台同胞通行证
        // 13:外国人居留证
        // 14:台胞证
        // 15:港澳台居住证
        // 16：营业执照 （只有部分场景才会用到 如 受益人和股东）

        // 00:身份证
        // 01:护照
        // 02:军官证
        // 03:士兵证
        // 04:回乡证
        // 05:户口本
        // 06:外国护照
        // 07:其他
        // 08:暂住证
        // 09:警官证
        // 10:文职干部证
        // 11:港澳台同胞通行证
        // 13:外国人居留证
        // 14:台胞证
        // 15:港澳台居住证
        switch (code) {
            case "1":
                return "00";
            case "2":
                return "01";
            case "3":
                return "02";
            case "4":
                return "03";
            case "5":
                return "04";
            case "6":
                return "05";
            case "7":
                return "06";
            case "8":
                return "07";
            case "9":
                return "08";
            case "10":
                return "09";
            case "11":
                return "10";
            case "12":
                return "11";
            case "13":
                return "13";
            case "14":
                return "14";
            case "15":
                return "15";
            default:
                return null;
        }
    }

    public static String busiType(Integer sceneType) {
        PayEnums.SCENE_TYPE scene_type = PayEnums.SCENE_TYPE.from(sceneType);
        switch (scene_type) {
            case ONLINE:
                return "2";
            case OFFLINE:
                return "1";
            default:
                return "1";
        }
    }

    public static String sceneType(Integer sceneType) {
        PayEnums.SCENE_TYPE scene_type = PayEnums.SCENE_TYPE.from(sceneType);
        switch (scene_type) {
            case ONLINE:
                return "ONLINE";
            case OFFLINE:
                return "OFFLINE";
            default:
                return "ALL";
        }
    }

    public static String getCardInfo(MerchantAccessCardDO merchantAccessCardDO) {
        JSONObject dto = new JSONObject();
        // 结算账户类型
        dto.put("card_type", merchantAccessCardDO.getType());
        // 结算账户名
        dto.put("card_name", merchantAccessCardDO.getName());
        // 结算账号
        dto.put("card_no", merchantAccessCardDO.getCardNo());
        // 银行所在省
        dto.put("prov_id", merchantAccessCardDO.getProvinceCode());
        // 银行所在市
        dto.put("area_id", merchantAccessCardDO.getCityCode());
        // 银行编号参考： [银行编码](https://paas.huifu.com/partners/api/#/csfl/api_csfl_yhbm) ；
        // &lt;font color&#x3D;&quot;green&quot;&gt;示例值：01020000 &lt;/font&gt;
        // &lt;br/&gt;当card_type&#x3D;0时必填， 当card_type&#x3D;1或2时非必填
        dto.put("bank_code", merchantAccessCardDO.getBankCode());
        // 联行号参考：[银行支行编码](https://paas.huifu.com/partners/api/#/csfl/api_csfl_yhzhbm)
        // 当card_type&#x3D;0时必填， 当card_type&#x3D;1或2时非必填 &lt;br/&gt;&lt;font
        // color&#x3D;&quot;green&quot;&gt;示例值：102290026507&lt;/font&gt;
        dto.put("branch_code", merchantAccessCardDO.getBranchCode());
        // 支行名称开户支行名称。 当card_type&#x3D;0时必填， 当card_type&#x3D;1或2时非必填；
        // &lt;br/&gt;&lt;font
        // color&#x3D;&quot;green&quot;&gt;示例值：中国工商银行上海市中山北路支行&lt;/font&gt;
        dto.put("branch_name", merchantAccessCardDO.getBankName());
        // 持卡人证件类型参见《[自然人证件类型](https://paas.huifu.com/partners/api/#/api_ggcsbm?id&#x3D;%e8%87%aa%e7%84%b6%e4%ba%ba%e8%af%81%e4%bb%b6%e7%b1%bb%e5%9e%8b)》
        // 当card_type&#x3D;0时为空， 当card_type&#x3D;1或2时必填；&lt;font
        // color&#x3D;&quot;green&quot;&gt;示例值：00&lt;/font&gt;
        if(StringUtils.hasText(merchantAccessCardDO.getCertType())){
            dto.put("cert_type", certType(merchantAccessCardDO.getCertType()));
            // 持卡人证件有效期截止日期日期格式：yyyyMMdd，以北京时间为准。&lt;font
            // color&#x3D;&quot;green&quot;&gt;示例值：20220125&lt;/font&gt;，当cert_validity_type&#x3D;0时必填；当cert_validity_type&#x3D;1时为空
            dto.put("cert_end_date", HuiFuUtil.date(merchantAccessCardDO.getCertEndDate()));
            // 持卡人证件号码
            dto.put("cert_no", merchantAccessCardDO.getCertNo());
            // 持卡人证件有效期类型
            dto.put("cert_validity_type", merchantAccessCardDO.getCertValidityType());
            // 持卡人证件有效期开始
            dto.put("cert_begin_date", HuiFuUtil.date(merchantAccessCardDO.getCertBeginDate()));
        }
        // 银行卡绑定手机号
        dto.put("mp", merchantAccessCardDO.getCardPhone());

        return dto.toJSONString();
    }
    // private static String getCardInfo(MerchantAccessCardDO merchantAccessCardDO)
    // {
    // JSONObject dto = new JSONObject();
    // // 结算账户类型
    // // dto.put("card_type", merchantAccessCardDO.getType());
    // // 结算账户名
    // dto.put("card_name", merchantAccessCardDO.getName());
    // // 结算账号
    // dto.put("card_no", merchantAccessCardDO.getCardNo());
    // // 银行所在省
    // dto.put("prov_id", merchantAccessCardDO.getProvinceCode());
    // // 银行所在市
    // dto.put("area_id", merchantAccessCardDO.getCityCode());
    // // 银行编号参考： [银行编码](https://paas.huifu.com/partners/api/#/csfl/api_csfl_yhbm) ；
    // // &lt;font color&#x3D;&quot;green&quot;&gt;示例值：01020000 &lt;/font&gt;
    // // &lt;br/&gt;当card_type&#x3D;0时必填， 当card_type&#x3D;1或2时非必填
    // dto.put("bank_code", merchantAccessCardDO.getBankCode());
    // // 联行号参考：[银行支行编码](https://paas.huifu.com/partners/api/#/csfl/api_csfl_yhzhbm)
    // // 当card_type&#x3D;0时必填， 当card_type&#x3D;1或2时非必填 &lt;br/&gt;&lt;font
    // // color&#x3D;&quot;green&quot;&gt;示例值：102290026507&lt;/font&gt;
    // // dto.put("branch_code", merchantAccessCardDO.getBranchCode());
    // // 支行名称开户支行名称。 当card_type&#x3D;0时必填， 当card_type&#x3D;1或2时非必填；
    // // &lt;br/&gt;&lt;font
    // // color&#x3D;&quot;green&quot;&gt;示例值：中国工商银行上海市中山北路支行&lt;/font&gt;
    // // dto.put("branch_name", merchantAccessCardDO.getName());
    // //
    // 持卡人证件类型参见《[自然人证件类型](https://paas.huifu.com/partners/api/#/api_ggcsbm?id&#x3D;%e8%87%aa%e7%84%b6%e4%ba%ba%e8%af%81%e4%bb%b6%e7%b1%bb%e5%9e%8b)》
    // // 当card_type&#x3D;0时为空， 当card_type&#x3D;1或2时必填；&lt;font
    // // color&#x3D;&quot;green&quot;&gt;示例值：00&lt;/font&gt;
    // dto.put("cert_type", merchantAccessCardDO.getCertType());
    // // 持卡人证件有效期截止日期日期格式：yyyyMMdd，以北京时间为准。&lt;font
    // //
    // color&#x3D;&quot;green&quot;&gt;示例值：20220125&lt;/font&gt;，当cert_validity_type&#x3D;0时必填；当cert_validity_type&#x3D;1时为空
    // dto.put("cert_end_date",
    // HuiFuUtil.date(merchantAccessCardDO.getCertEndDate()));
    // // 持卡人证件号码
    // dto.put("cert_no", merchantAccessCardDO.getCertNo());
    // // 持卡人证件有效期类型
    // dto.put("cert_validity_type",
    // merchantAccessCardDO.getCertValidityType().toString());
    // // 持卡人证件有效期开始
    // dto.put("cert_begin_date",
    // HuiFuUtil.date(merchantAccessCardDO.getCertBeginDate()));
    // // 银行卡绑定手机号
    // dto.put("mp", merchantAccessCardDO.getCardPhone());
    //
    // return dto.toJSONString();
    // }

    public static CommonResult<String> fileUploadProcess(Map<String, String> fileMap, String fileUrl,String fileName, String fileType) {
        if (!StringUtils.hasText(fileUrl)) {
            return CommonResult.success();
        }
        String fileKey = fileUrl.hashCode() + fileType;
        String fileId = fileMap.get(fileKey);
        if (StringUtils.hasText(fileId)) {
            log.info("汇付文件映射获取成功 fileUrl:{},fileId:{}", fileUrl, fileId);
            return CommonResult.success(fileId);
        }
        log.info("汇付文件映射获取未成功 fileType:{}, fileUrl:{}", fileType, fileUrl);
        CommonResult<String> f371 = HuiFuUtil.fileUpload(fileUrl, fileName,fileType);
        if (f371.isSuccess()) {
            fileMap.put(fileKey, f371.getData());
        }
        return f371;
    }


    public static MerConfig merConfig(HuiFuConfig huiFuConfig) {
        /**
         * prodMode 模式，默认为生产模式 MODE_PROD = "prod"; // 生产环境 MODE_TEST = "test"; //
         * 线上联调环境(针对商户联调测试)
         */
        BasePay.prodMode = BasePay.MODE_PROD;
        MerConfig merConfig = new MerConfig();
        merConfig.setProcutId(huiFuConfig.getProductId());
        merConfig.setSysId(huiFuConfig.getSysId());
        merConfig.setRsaPrivateKey(huiFuConfig.getRsaPrivateKey());
        merConfig.setRsaPublicKey(huiFuConfig.getRsaPublicKey());
        merConfig.setHuifuId(huiFuConfig.getUpperHuifuId());
        return merConfig;
    }
}
